package com.projectCommon.util.commonUtil;

import java.io.*;
import java.util.Base64;


// 序列化 对象工具类，
// 目前用在了dubbo 传递信息的时候。
public class SerializationUtil {

    /**
     * 将对象序列化为 Base64 编码的字符串
     *
     * @param object 要序列化的对象
     * @param <T>    对象的类型
     * @return 序列化后的字符串
     * @throws IOException 如果序列化失败
     */
    public static <T> String serialize(T object) {
        if (object == null) {
            throw new IllegalArgumentException("Object to serialize cannot be null");
        }

        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(bos)) {
            // 将对象写入字节输出流
            oos.writeObject(object);
            oos.flush();
            // 使用 Base64 将字节数组编码为字符串
            return Base64.getEncoder().encodeToString(bos.toByteArray());
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将 Base64 编码的字符串反序列化为对象
     *
     * @param data  Base64 编码的字符串
     * @param <T>   目标对象的类型
     * @return 反序列化后的对象
     * @throws IOException            如果解码失败
     * @throws ClassNotFoundException 如果无法找到对象的类
     */
    @SuppressWarnings("unchecked")
    public static <T> T deserialize(String data)  {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("Data to deserialize cannot be null or empty");
        }

        // 使用 Base64 解码为字节数组
        byte[] bytes = Base64.getDecoder().decode(data);

        try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
             ObjectInputStream ois = new ObjectInputStream(bis)) {
            // 读取并反序列化对象
            return (T) ois.readObject();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
